//
// Created by PC on 2023/6/28.
/*
古籍翻译
 https://www.luogu.com.cn/problem/B3617
 解析:
 https://www.luogu.com.cn/blog/XZ-ZXB/b3617-gu-ji-fan-yi
 难度:普及
 题目描述

机器猫跑到外星人的图书馆去读书。有一本外星古籍，里面的内容是用八进制写成的；但机器猫只能处理十六进制的数据。请你帮忙写一个翻译软件，帮机器猫把八进制串翻译成十六进制串。
输入格式
一行，一个八进制字符串 s，表示古籍内容。
输出格式
一行，一个十六进制字符串，表示翻译结果。
输入输出样例
输入 #1 144 输出 #1 64
输入 #2 1572061125 输出 #2 de86255
输入12000120 输出280050
 这个用例: 最低4位 0120 (转为16进制是50,但是前边要补零为050)
 输入6000000 (输出180000也是要补零的问题)
 输入00000 输出0 (全零也要留意到)
说明/提示
第一组样例：八进制 144 即十进制下的 100，其十六进制表示为 64。
第二组样例：八进制 1572061125 即十进制下的 233333333，其十六进制表示为 de86255。
数据规模与约定
对于 40% 的数据，有 ∣s∣≤10，即输入字符串长度不超过 10。
对于 100% 的数据，有 ∣s∣≤1000，即输入字符串长度不超过 1000。
 * */
// 思路: 每4位8进制数(octonary)对应3位16进制数(hexadecimal), 可以将8进制数每4个一段来转换
// 如果直接整个转换的话, 会超出整型的范围
//



#include <iostream>
#include <cmath>

using namespace std;

// x^y
int myPow(int x, int y)
{
    int ret = 1;
    while (y--)
        ret *= x;
    return ret;
}

// 字符串(都是数字)转整数
int strToInt(string s)
{
    int ret = 0;
    for (int i = 0; i < s.size(); ++i)
    {
        ret += (s[i] - '0') * myPow(10, s.size() - i - 1);
    }
    return ret;
}

// 8进制数转成10进制数
int octToDec(int oct, int length = 0)
{
    int ret = 0;
    for (int i = 0; i < length; ++i)
    {
        int t = oct % 10;
        oct /= 10;
        ret += t * pow(8, i);
//        ret += t * myPow(8, i);
    }
    return ret;
}

int main()
{
//    string oct = "1572061125";
    string oct = "12000120";
    cin >> oct;
    int length = oct.size();
    string hexStr;
    for (int i = length - 1; i >= 0; i -= 4)
    {
        // 如果最后不足3位的话, 就从0位置开始截取
        int begin = i < 3 ? 0 : i - 3;
        // 如果最后不足3位的话, 截取长度也要减少
        int n = i < 3 ? i + 1 : 4;
        string t = oct.substr(begin, n);
//        printf("%s: ",t.c_str());
//        printf("%0x\n", octToDec(strToInt(t),t.size()));
        int decInt = octToDec(strToInt(t), t.size());
        // 如果输入是零, 直接打印0, 退出程序
        if (decInt==0)
        {
            cout<<'0';
            return 0;
        }
        char hexChars[5] = {0}; // [3]不行?todo
        // 保证3位长度, 不足3位的补零
        sprintf(hexChars, "%03x", decInt);
        string curStr= hexChars;
        hexStr.insert(0, curStr);
//        printf("%s\n", hexStr.c_str());
    }
    bool printZero=false;
    for (char i : hexStr)
    {
        // 如果字符串前边是'0', 要跳过不打印
        if (i!='0')
            printZero=true;
        if (printZero)
            cout<<i;
    }
    return 0;
}